package Test.限流算法;

/**
 * @Author: kirito
 * @Date: 2025/3/11 20:06
 * @Description:
 *
 * 一个容量为capacity的漏桶，以恒定速率rate处理请求
 * 一个请求过来判断是否count大于capacity 大于则丢弃
 *
 * 另外起一个线程以恒定速率处理漏桶中的请求
 *  记录当前的时间戳，与上次的时间相减  然后乘以速率代表处理的请求
 *  然后更新桶中的count
 */

public class 漏桶test {
    private int capacity = 100;
    private int count = 0;
    private int rate = 10; //每时间单位多少个请求
    private long lastTime = 0L;//上次漏水的时间戳

    public synchronized boolean func() {
        if (count >= capacity) {
            return false;
        }
        count++;
        return true;
    }


    // 模拟处理请求的方法
    public void processRequests() {
        new Thread(() -> {
            while (true) {
                long currentTimeMillis = System.currentTimeMillis();
                long elapsedTime = currentTimeMillis - lastTime; // 计算时间差
                int processedRequests = (int) (elapsedTime * rate / 1000); // 计算应该处理的请求数量
                if (processedRequests > 0) {
                    int toProcess = Math.min(processedRequests, count); // 实际可以处理的请求数量
                    count -= toProcess; // 更新桶中的请求计数
                    lastTime = currentTimeMillis; // 更新上次处理时间
                }
                try {
                    // 模拟处理请求需要一定时间
                    Thread.sleep(1000 / rate);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
